package com.ruoyi.wms.mapper;

import java.util.List;
import java.math.BigDecimal;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.wms.domain.WmsInventory;

/**
 * 库存信息Mapper接口
 * 
 * @author ruoyi
 * @date 2024-01-01
 */
public interface WmsInventoryMapper 
{
    /**
     * 查询库存信息
     * 
     * @param inventoryId 库存信息主键
     * @return 库存信息
     */
    public WmsInventory selectWmsInventoryById(Long inventoryId);

    /**
     * 查询库存信息列表
     * 
     * @param wmsInventory 库存信息
     * @return 库存信息集合
     */
    public List<WmsInventory> selectWmsInventoryList(WmsInventory wmsInventory);

    /**
     * 根据条件查询库存记录
     * 
     * @param wmsInventory 库存查询条件
     * @return 库存信息
     */
    public WmsInventory selectWmsInventoryByCondition(WmsInventory wmsInventory);

    /**
     * 新增库存信息
     * 
     * @param wmsInventory 库存信息
     * @return 结果
     */
    public int insertWmsInventory(WmsInventory wmsInventory);

    /**
     * 修改库存信息
     * 
     * @param wmsInventory 库存信息
     * @return 结果
     */
    public int updateWmsInventory(WmsInventory wmsInventory);

    /**
     * 删除库存信息
     * 
     * @param inventoryId 库存信息主键
     * @return 结果
     */
    public int deleteWmsInventoryById(Long inventoryId);

    /**
     * 批量删除库存信息
     * 
     * @param inventoryIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteWmsInventoryByIds(Long[] inventoryIds);

    /**
     * 增加库存数量
     * 
     * @param inventoryId 库存ID
     * @param qty 增加数量
     * @param updateBy 更新人
     * @return 结果
     */
    public int increaseInventoryQty(@Param("inventoryId") Long inventoryId, @Param("qty") BigDecimal qty, @Param("updateBy") String updateBy);

    /**
     * 减少库存数量
     * 
     * @param inventoryId 库存ID
     * @param qty 减少数量
     * @param updateBy 更新人
     * @return 结果
     */
    public int decreaseInventoryQty(@Param("inventoryId") Long inventoryId, @Param("qty") BigDecimal qty, @Param("updateBy") String updateBy);

    /**
     * 冻结库存数量
     * 
     * @param inventoryId 库存ID
     * @param qty 冻结数量
     * @param updateBy 更新人
     * @return 结果
     */
    public int freezeInventoryQty(@Param("inventoryId") Long inventoryId, @Param("qty") BigDecimal qty, @Param("updateBy") String updateBy);

    /**
     * 解冻库存数量
     * 
     * @param inventoryId 库存ID
     * @param qty 解冻数量
     * @param updateBy 更新人
     * @return 结果
     */
    public int unfreezeInventoryQty(@Param("inventoryId") Long inventoryId, @Param("qty") BigDecimal qty, @Param("updateBy") String updateBy);

    /**
     * 查询库存总量
     * 
     * @param tenantId 租户ID
     * @param ownerId 货主ID
     * @param warehouseId 仓库ID
     * @param itemId 商品ID
     * @param inventoryStatus 库存状态
     * @param locationId 库位ID（可为空）
     * @param supplierId 供应商ID（可为空）
     * @param batchNo 批次号（可为空）
     * @param containerNo 容器号（可为空）
     * @return 库存总量
     */
    public BigDecimal selectInventoryTotalQty(@Param("tenantId") Long tenantId, 
                                             @Param("ownerId") Long ownerId,
                                             @Param("warehouseId") Long warehouseId,
                                             @Param("itemId") Long itemId,
                                             @Param("inventoryStatus") String inventoryStatus,
                                             @Param("locationId") Long locationId,
                                             @Param("supplierId") Long supplierId,
                                             @Param("batchNo") String batchNo,
                                             @Param("containerNo") String containerNo);

    /**
     * 查询库存列表（按FIFO排序）
     * 
     * @param tenantId 租户ID
     * @param ownerId 货主ID
     * @param warehouseId 仓库ID
     * @param itemId 商品ID
     * @param inventoryStatus 库存状态
     * @param locationId 库位ID（可为空）
     * @param supplierId 供应商ID（可为空）
     * @param batchNo 批次号（可为空）
     * @param containerNo 容器号（可为空）
     * @return 库存列表
     */
    public List<WmsInventory> selectInventoryListForDecrease(@Param("tenantId") Long tenantId, 
                                                           @Param("ownerId") Long ownerId,
                                                           @Param("warehouseId") Long warehouseId,
                                                           @Param("itemId") Long itemId,
                                                           @Param("inventoryStatus") String inventoryStatus,
                                                           @Param("locationId") Long locationId,
                                                           @Param("supplierId") Long supplierId,
                                                           @Param("batchNo") String batchNo,
                                                           @Param("containerNo") String containerNo);

    /**
     * 批量更新库存数量
     * 
     * @param list 库存更新列表
     * @return 结果
     */
    public int batchUpdateInventoryQty(@Param("list") List<WmsInventory> list);

    /**
     * 删除库存数量为0的记录
     * 
     * @param tenantId 租户ID
     * @param ownerId 货主ID
     * @param warehouseId 仓库ID
     * @param itemId 商品ID
     * @param inventoryStatus 库存状态
     * @param locationId 库位ID（可为空）
     * @param supplierId 供应商ID（可为空）
     * @param batchNo 批次号（可为空）
     * @param containerNo 容器号（可为空）
     * @return 结果
     */
    public int deleteZeroQtyInventory(@Param("tenantId") Long tenantId, 
                                     @Param("ownerId") Long ownerId,
                                     @Param("warehouseId") Long warehouseId,
                                     @Param("itemId") Long itemId,
                                     @Param("inventoryStatus") String inventoryStatus,
                                     @Param("locationId") Long locationId,
                                     @Param("supplierId") Long supplierId,
                                     @Param("batchNo") String batchNo,
                                     @Param("containerNo") String containerNo);
}